import sys
from bisect import bisect_right, bisect_left
import os
import sys
from io import BytesIO, IOBase
from math import factorial, floor, inf, ceil, gcd
from collections import defaultdict, deque, Counter
from functools import cmp_to_key
from heapq import heappop, heappush, heapify
BUFSIZE = 8192
class FastIO(IOBase):
newlines = 0
def __init__(self, file):
self._fd = file.fileno()
self.buffer = BytesIO()
self.writable = "x" in file.mode or "r" not in file.mode
self.write = self.buffer.write if self.writable else None
def read(self):
while True:
b = os.read(self._fd, max(os.fstat(self._fd).st_size, BUFSIZE))
if not b:
break
ptr = self.buffer.tell()
self.buffer.seek(0, 2), self.buffer.write(b), self.buffer.seek(ptr)
self.newlines = 0
return self.buffer.read()
def readline(self):
while self.newlines == 0:
b = os.read(self._fd, max(os.fstat(self._fd).st_size, BUFSIZE))
self.newlines = b.count(b"\n") + (not b)
ptr = self.buffer.tell()
self.buffer.seek(0, 2), self.buffer.write(b), self.buffer.seek(ptr)
self.newlines -= 1
return self.buffer.readline()
def flush(self):
if self.writable:
os.write(self._fd, self.buffer.getvalue())
self.buffer.truncate(0), self.buffer.seek(0)
class IOWrapper(IOBase):
def __init__(self, file):
self.buffer = FastIO(file)
self.flush = self.buffer.flush
self.writable = self.buffer.writable
self.write = lambda s: self.buffer.write(s.encode("ascii"))
self.read = lambda: self.buffer.read().decode("ascii")
self.readline = lambda: self.buffer.readline().decode("ascii")
sys.stdin, sys.stdout = IOWrapper(sys.stdin), IOWrapper(sys.stdout)
input = lambda: sys.stdin.readline().rstrip("\r\n")
def inp():
return(int(input()))
def inlt():
return(list(map(int,input().split())))
def insr():
s = input().strip()
return(s)
def invr():
return(map(int,input().split()))
def insr2():
s = input()
return(s.split(" "))
def sqrt(num):
l, r = 0, 10**18 + 7
while r-l != 1:
mid = (l+r)//2
square = mid*mid
if square <= num:
l = mid
else:
r = mid
return l
def build_mod_inverses(n, r, p):
fact = [1] * (n + 1)
for i in range(1, n + 1):
fact[i] = i * fact[i - 1] % p
inv = [1] * (n + 1)
inv[n] = pow(fact[n], p - 2, p)
for i in range(n - 1, -1, -1):
inv[i] = (i + 1) * inv[i + 1] % p
return fact, inv
def comb(n, r, p, fact, inv):
return fact[n] * inv[r] % p * inv[n - r] % p if n >= r >= 0 else 0
def make_divisors(n):
divisors = []
for i in range(1, int(n**0.5)+1):
if n % i == 0:
divisors.append(i)
if i != n // i and i != 1:
divisors.append(n // i)
return divisors
def dfs(graph, vertex):
visited = set()
tree = []
deq = deque([vertex])
while deq:
vertex = deq.pop()
if vertex not in visited:
visited.add(vertex)
deq.extend(graph[vertex])
tree.append(vertex)
return tree
def find_in_sorted_list(elem, sorted_list):
'Locate the leftmost value exactly equal to x'
i = bisect_left(sorted_list, elem)
if i != len(sorted_list) and sorted_list[i] == elem:
return i
return -1
class SegmentTree:
def __init__(self, data, default=0, func=lambda a, b: a+b):
self._default = default
self._func = func
self._len = len(data)
self._size = _size = 1 << (self._len - 1).bit_length()
self.data = [default] * (2 * _size)
self.data[_size:_size + self._len] = data
for i in reversed(range(_size)):
self.data[i] = func(self.data[i + i], self.data[i + i + 1])
def __delitem__(self, idx):
self[idx] = self._default
def __getitem__(self, idx):
return self.data[idx + self._size]
def __setitem__(self, idx, value):
idx += self._size
self.data[idx] = value
idx >>= 1
while idx:
self.data[idx] = self._func(self.data[2 * idx], self.data[2 * idx + 1])
idx >>= 1
def __len__(self):
return self._len
def query(self, start, stop):
if start == stop:
return self.__getitem__(start)
start += self._size
stop += self._size
res = self._default
while start < stop:
if start & 1:
res = self._func(res, self.data[start])
start += 1
if stop & 1:
stop -= 1
res = self._func(res, self.data[stop])
start >>= 1
stop >>= 1
return res
def __repr__(self):
return "SegmentTree({0})".format(self.data)
class DisjointSetUnion():
def __init__(self, n):
self.n = n
self.parents = [-1] * n
self.group = n
def find(self, x):
if self.parents[x] < 0:
return x
else:
self.parents[x] = self.find(self.parents[x])
return self.parents[x]
def union(self, x, y):
x = self.find(x)
y = self.find(y)
if x == y:
return
self.group -= 1
if self.parents[x] > self.parents[y]:
x, y = y, x
self.parents[x] += self.parents[y]
self.parents[y] = x
def size(self, x):
return -self.parents[self.find(x)]
def same(self, x, y):
return self.find(x) == self.find(y)
def members(self, x):
root = self.find(x)
return [i for i in range(self.n) if self.find(i) == root]
def roots(self):
return [i for i, x in enumerate(self.parents) if x < 0]
def group_count(self):
return self.group
def all_group_members(self):
dic = {r:[] for r in self.roots()}
for i in range(self.n):
dic[self.find(i)].append(i)
return dic
def __str__(self):
return '\n'.join('{}: {}'.format(r, self.members(r)) for r in self.roots())
__ = inp()
for _ in range(__):
def solve():
n,m = inlt()
cur_time = 0
a,b = m,m
f = True
for i in range(n):
t, l, r = inlt()
a = max(l, a-(t-cur_time))
b = min(r, b+(t-cur_time))
cur_time = t
if a > b and f:
print('NO')
f = False
if f:
print('YES')
return
solve()
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef vector<ll> vi;
typedef pair<ll,ll> pii;
#define F first
#define S second
#define pb push_back
#define mp make_pair
#define rep(i,a,b) for (ll i = a; i <= b; i++)
/*void update(ll k,ll n,vi &tree,ll x)
{
while(k<=n)
{
tree[k]+=x;
k+=(k&-k);
}
}
ll read(ll k,vi &tree)
{
ll sum=0;
while(k>=1)
{
sum+=tree[k];
k-=(k&-k);
}
return sum;
}*/
int main()
{
ios::sync_with_stdio(0);
cin.tie(0);
int t; cin >> t;
while(t--)
{
ll n,m; cin >> n >> m;
vi q(n),l(n),h(n);
rep(i,0,n-1) cin >> q[i] >> l[i] >> h[i];
ll mn=m,mx=m;
ll prev=0;
bool b=true;
rep(i,0,n-1)
{
mn-=q[i]-prev;
mx+=q[i]-prev;
if(mn>h[i] || mx<l[i])
{
b=false;
break;
}
mn=max(mn,l[i]);
mx=min(mx,h[i]);
prev=q[i];
}
if(!b) cout << "NO" << '\n';
else cout << "YES" << '\n';
}
}
2099. Find Subsequence of Length K With the Largest Sum | 1608A - Find Array |
416. Partition Equal Subset Sum | 1446. Consecutive Characters |
1618A - Polycarp and Sums of Subsequences | 1618B - Missing Bigram |
938. Range Sum of BST | 147. Insertion Sort List |
310. Minimum Height Trees | 2110. Number of Smooth Descent Periods of a Stock |
2109. Adding Spaces to a String | 2108. Find First Palindromic String in the Array |
394. Decode String | 902. Numbers At Most N Given Digit Set |
221. Maximal Square | 1200. Minimum Absolute Difference |
1619B - Squares and Cubes | 1619A - Square String |
1629B - GCD Arrays | 1629A - Download More RAM |
1629C - Meximum Array | 1629D - Peculiar Movie Preferences |
1629E - Grid Xor | 1629F1 - Game on Sum (Easy Version) |
2148. Count Elements With Strictly Smaller and Greater Elements | 2149. Rearrange Array Elements by Sign |
2150. Find All Lonely Numbers in the Array | 2151. Maximum Good People Based on Statements |
2144. Minimum Cost of Buying Candies With Discount | Non empty subsets |